package com.xuzz.study.redis.client;

import java.io.IOException;
import java.io.OutputStream;

/**
 * @author xuzz
 * @description
 * @date 2019-12-26 19:45
 */
public class Protocol {

    private static String PARAM_NUM="*";
    private static String PARAM_BYTE_NUM="$";
    private static String TERMINATION="\r\n";


    /**
     * *    <参数数量> CR LF
     * $    <参数 1 的字节数量> CR LF
     *      <参数 1 的数据> CR LF
     *      ...
     * $    <参数 N 的字节数量> CR LF
     *      <参数 N 的数据> CR LF
     * */
    public static void sendCommand(OutputStream outputStream,Command command, byte[]... params)
    {
        /*
            照着 SET mykey myvalue 的格式进行编码：
            *3
            $3
                SET
            $5
                mykey
            $7
                myvalue
            最终如下：
            "*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n"
        */
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(PARAM_NUM).append(params.length+1).append(TERMINATION);
        stringBuffer.append(PARAM_BYTE_NUM).append(command.name().length()).append(TERMINATION);
        stringBuffer.append(command).append(TERMINATION);
        for(byte[] param : params)
        {
            stringBuffer.append(PARAM_BYTE_NUM).append(param.length).append(TERMINATION);
            stringBuffer.append(new String(param)).append(TERMINATION);
        }

        try
        {
            outputStream.write(stringBuffer.toString().getBytes());

        }
        catch(IOException ex)
        {

        }
    }
    public static enum Command{
        SET,
        GET
    }
}
